#define _CRT_SECURE_NO_WARNINGS 
//#include<iostream>
//using namespace std;
//using ll = long long;
//const ll N = 1e6 + 10;
//ll n = 3;
//ll cnt[N];
//ll pre_sum[N];
//void dfs(ll dep, ll next, ll sum, ll mul)
//{
//	if (mul > 1e6)
//	{
//		return;
//	}
//	if (dep == n + 1)
//	{
//		cnt[mul]++;
//		return;
//	}
//	ll up = pow(1.0 * 1e6 / mul, 1.0 / (n - dep + 1)) + 3;
//	for (ll j = next + 1; j < (dep == n ? min(sum, up) : up); j++)
//	{
//		dfs(dep + 1, j, sum + j, mul * j);
//	}
//}
//int main()
//{
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
//	ll t = 0;
//	cin >> t;
//	dfs(1, 0, 0, 1);
//	for (ll i = 1; i <= 1e6; i++)
//	{
//		pre_sum[i] = pre_sum[i - 1] + cnt[i];
//	}
//	for (ll i = 1; i <= t; i++)
//	{
//		ll left, right;
//		cin >> left >> right;
//		cout << pre_sum[right] - pre_sum[left - 1] << endl;
//	}
//	return 0;
//}
//double num1 = 4;
//double temp1 = pow(num1, 1.0 / 2);
//double num2 = 8;
//double temp2 = pow(num2, 1.0 / 3);
//#include<iostream>
//#include<cmath>
//using namespace std;
//using ll = long long;
//const ll N = 1e5 + 10;
//ll n ;
//ll cnt[N];
//ll pre_sum[N];
//void dfs(ll dep, ll next,ll sum,ll mul)
//{
//	if (mul > 1e5)
//	{
//		return;
//	}
//	if (dep == n + 1)
//	{
//		cnt[mul]++;
//		return;
//	}
//	ll up = pow(1.0 * 1e5 / mul, 1.0 / (n - dep + 1)) + 3;
//	for (ll j = next + 1; j <(dep == n ? min(sum,up) : up); j++)
//	{
//		dfs(dep + 1, j,sum + j, mul * j);
//	}
//}
//int main()
//{
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
//	ll t = 0;
//	cin >> t >> n;
//	dfs(1, 0,0,1);
//	for (ll i = 1; i <= 1e5; i++)
//	{
//		pre_sum[i] = pre_sum[i - 1] + cnt[i];
//	}
//	for (ll i = 1; i <= t; i++)
//	{
//		ll left, right;
//		cin >> left >> right;
//		cout << pre_sum[right] - pre_sum[left - 1] << endl;
//	}
//	return 0;
//}
//#include<iostream>
//#include<cmath>
//using namespace std;
//using ll = long long;
//const ll N = 1e5 + 10;
//ll p = 1e9 + 10;
//ll n;
//ll dp[N];
//ll f(ll n)
//{
//	if (n <= 2)
//	{
//		return 1;
//	}
//	if (dp[n] != -1)
//	{
//		return dp[n];
//	}
//	return (f(n - 1) + f(n - 2)) % p;
//}
//int main()
//{
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
//	memset(dp, -1, sizeof(dp));
//	cin >> n;
//	cout << f(n) << endl;
//	return 0;
//}
//#include<iostream>
//#include<cmath>
//using namespace std;
//using ll = long long;
//const ll N = 1e5 + 10;
//ll p = 1e9 + 10;
//ll n;
//ll dp[N];
//ll f(ll n)
//{
//	if (n <= 2)
//	{
//		return 1;
//	}
//	if (dp[n] != -1)
//	{
//		return dp[n];
//	}
//	return (f(n - 1) + f(n - 2)) % p;
//}
//int main()
//{
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
//	memset(dp, -1, sizeof(dp));
//	cin >> n;
//	cout << f(n) << endl;
//	return 0;
//}
//#include<iostream>
//#include<cmath>
//#include<cstring>
//using namespace std;
//using ll = long long;
//const ll N = 1e3 + 10;
//ll n, m, k;
//ll start_x, start_y;
//ll dest_x, dest_y;
//ll dx[4] = { 0,0,1,-1 };
//ll dy[4] = { 1,-1,0,0 };
//ll matrix[N][N];
//ll dp[1003][1003][2];
//bool in_map(ll row,ll column)
//{
//	if (row >= 1 && row <= n && column >= 1 && column <= m)
//	{
//		return true;
//	}
//	else
//	{
//		return false;
//	}
//}
//bool dfs(ll row, ll column, ll tag)
//{
//	ll next_row = 0;
//	ll next_column = 0;
//	if (row == dest_x && column == dest_y)
//	{
//		return true;
//	}
//	if (dp[row][column][tag] != -1)
//	{
//		return dp[row][column][tag];
//	}
//	for (ll i = 0; i < 4; i++)
//	{
//		next_row = row + dx[i];
//		next_column = column + dy[i];
//		if (in_map(next_row, next_column) == false)
//		{
//			continue;
//		}
//		if (tag == 0)
//		{
//			if (matrix[row][column] > matrix[next_row][next_column] && dfs(next_row, next_column, 0))
//			{
//				dp[row][column][tag] = true;
//				return true;
//			}
//			if (matrix[row][column] + k > matrix[next_row][next_column] && dfs(next_row, next_column, 1))
//			{
//				dp[row][column][tag] = true;
//				return true;
//			}
//		}
//		else
//		{
//			if (matrix[row][column] > matrix[next_row][next_column] && dfs(next_row, next_column, 1))
//			{
//				dp[row][column][tag] = true;
//				return true;
//			}
//		}
//	}
//	dp[row][column][tag] = false;
//	return false;
//}
//int main()
//{
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
//	memset(dp, -1, sizeof(dp));
//	cin >> n >> m >> k;
//	cin >> start_x >> start_y;
//	cin >> dest_x >> dest_y;
//	for (ll i = 1; i <= n; i++)
//	{
//		for (ll j = 1; j <= m; j++)
//		{
//			cin >> matrix[i][j];
//		}
//	}
//	if (dfs(start_x,start_y,0))
//	{
//		cout << "Yes" << endl;
//	}
//	else
//	{
//		cout << "No" << endl;
//	}
//	return 0;
//}
//#include<iostream>
//#include<cmath>
//#include<set>
//#include<cstring>
//using namespace std;
//using ll = long long;
//const ll N = 1e3 + 10;
//const ll p = 1e9 + 7;
//ll n, m, k;
//ll start_x = 1, start_y = 1;
//ll dest_x = n , dest_y = m;
//ll dx[2] = { 0,1 };
//ll dy[2] = { 1,0 };
//ll matrix[N][N];
//ll dp[N][N];
//multiset<ll>ms;
//ll cnt = 0;
//ll cnt1 = 0;
//ll cnt2 = 0;
//bool in_map(ll row, ll column)
//{
//	if (row >= 1 && row <= n && column >= 1 && column <= m)
//	{
//		return true;
//	}
//	else
//	{
//		return false;
//	}
//}
//void dfs1(ll row, ll column)
//{
//	if (row == dest_x, column == dest_y)
//	{
//		cnt1++;
//		return;
//	}
//	if (dp[row][column] != -1)
//	{
//		return dp[row][column];
//	}
//	dp[row][column] = true;
//	ms.insert(matrix[row][column]);
//	for (ll i = 0; i < 2; i++)
//	{
//		ll next_row = row + dx[i];
//		ll next_column = column + dy[i];
//		if (in_map(next_row, next_column))
//		{
//			continue;
//		}
//		dfs1(next_row, next_column);
//	}
//	dp[row][column] = false;
//}
//void dfs2(ll row,ll column)
//{
//	if (row == dest_x, column == dest_y)
//	{
//		cnt2++;
//		return;
//	}
//	if (dp[row][column] != -1)
//	{
//		return dp[row][column];
//	}
//	dp[row][column] = true;
//	ms.insert(matrix[row][column]);
//	for (ll i = 0; i < 2; i++)
//	{
//		ll next_row = row + dx[i];
//		ll next_column = column + dy[i];
//		if (in_map(next_row, next_column))
//		{
//			continue;
//		}
//		if (matrix[next_row][next_column] > ms.top())
//		{
//			dp[next_row][next_column] = true;
//		}
//		dfs2(next_row, next_column);
//	}
//	dp[row][column] = false;
//}
//int main()
//{
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
//	memset(dp, -1, sizeof(dp));
//	cin >> n >> m >> k;
//	for (ll i = 1; i <= n; i++)
//	{
//		for (ll j = 1; j <= m; j++)
//		{
//			cin >> matrix[i][j];
//		}
//	}
//	dfs1(1, 1);
//	dfs2(1, 1);
//	cnt = cnt1 + cnt2;
//	cnt = cnt % p;
//	cout << cnt << endl;
//	return 0;
//}
#include<iostream>
#include<cmath>
#include<set>
#include<cstring>
using namespace std;
using ll = long long;
const ll p = 1e9 + 7;
ll n, m, k;
ll dx[2] = { 0,1 };
ll dy[2] = { 1,0 };
ll matrix[55][55];
ll dp[55][55][15][15];
ll cnt;
ll res;

ll dfs(ll x, ll y, ll mx, ll cnt)
{
	if (x == n && y == m)
	{
		return cnt == k;
	}
	if (dp[x][y][mx][cnt] != -1)
	{
		return dp[x][y][mx][cnt];
	}
	res = 0;
	for (ll i = 0; i < 2; i++)
	{
		ll xx = x + dx[i];
		ll yy = y + dy[i];
		if (xx < 1 || yy < 1 || xx > n || yy > m)
		{
			continue;
		}
		if (matrix[xx][yy] > mx && cnt < k)
		{
			res = (res + dfs(xx, yy, matrix[xx][yy], cnt + 1)) % p;
		}
		res = (res + dfs(xx, yy, mx, cnt)) % p;
		res %= p;
	}
	return dp[x][y][mx][cnt] = res;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	memset(dp, -1, sizeof(dp));
	cin >> n >> m >> k;
	for (ll i = 1; i <= n; i++)
	{
		for (ll j = 1; j <= m; j++)
		{
			cin >> matrix[i][j];
			matrix[i][j]++;
		}
	}
	cout << (dfs(1, 1, 0, 0) + dfs(1, 1, matrix[1][1], 1)) % p << endl;
	return 0;
}